约 2688 字

约 13 分钟

#C 语言标准库头文件 stdalign.h

这个头文件提供 内存对齐 的相关功能。

#示例

#include <stdio.h>
#include <stdalign.h>  // 提供 alignas, alignof, __alignas_is_defined, __alignof_is_defined 等宏

struct data {
    char c;
    alignas(16) int arr[4];  // arr 数组将按 16 字节对齐
};

int main(void) {
    // 检查编译器是否支持对齐特性
    #ifdef __alignas_is_defined
        printf("编译器支持 alignas\n");
    #endif
    
    #ifdef __alignof_is_defined
        printf("编译器支持 alignof\n");
    #endif

    // 使用 alignof 获取类型的对齐要求
    printf("char 的对齐长度为: %zu 字节\n", alignof(char));
    printf("int 的对齐长度为: %zu 字节\n", alignof(int));
    printf("double 的对齐长度为: %zu 字节\n", alignof(double));
    printf("struct data 的对齐长度为: %zu 字节\n", alignof(struct data));

    // 使用alignas指定对齐
    alignas(32) int x;  // x 将按32字节对齐
    printf("x 的地址为: %p (按 32 字节对齐)\n", (void*)&x);

    // 检查结构体成员的对齐
    struct data d;
    printf("d.arr 的地址为: %p (按 16 字节对齐)\n", (void*)&d.arr);

    return 0;
}

运行结果:

编译器支持 alignas
编译器支持 alignof
char 的对齐长度为: 1 字节
int 的对齐长度为: 4 字节
double 的对齐长度为: 8 字节
struct data 的对齐长度为: 16 字节
x 的地址为: 0x7ffc77626660 (按 32 字节对齐)
d.arr 的地址为: 0x7ffc77626680 (按 16 字节对齐)

#宏

宏标准说明
alignasC11(在 C23 废弃)定义为关键字 _Alignas
alignofC11(在 C23 废弃)定义为关键字 _Alignof

#常量

常量标准说明
__alignas_is_definedC11(在 C23 废弃)表示定义了 alignas
__alignof_is_definedC11(在 C23 废弃)表示定义了 _Alignof

#推荐阅读

更新: 2026/1/19

作者: PlanC

创建: 2025/6/14